package org.ciallo.simplemusicplayer.adapter;

import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import org.ciallo.simplemusicplayer.R;
import org.ciallo.simplemusicplayer.data.model.Song;
import org.ciallo.simplemusicplayer.util.TimeUtil;
import timber.log.Timber;

/**
 * @author Jukomu
 * @Description: 用于显示歌曲列表的 RecyclerView 适配器
 * 通用于单曲列表、专辑内歌曲、歌单内歌曲、收藏列表、搜索结果等
 * @Package: org.ciallo.simplemusicplayer.adapter
 * @Project: SimpleMusicPlayer
 * @name: SongAdapter
 * @Date: 2025/5/30-03:13
 * @Filename: SongAdapter
 */
public class SongAdapter extends ListAdapter<Song, SongAdapter.SongViewHolder> {

    private final OnSongClickListener songClickListener;
    private final OnSongOptionsClickListener optionsClickListener;

    /**
     * 歌曲项点击监听器接口。
     */
    public interface OnSongClickListener {
        /**
         * 当歌曲项被点击时调用。
         * @param song     被点击的歌曲对象。
         * @param position 被点击的歌曲在列表中的位置。
         */
        void onSongClick(Song song, int position);
    }

    /**
     * “更多操作”按钮点击监听器接口。
     */
    public interface OnSongOptionsClickListener {
        /**
         * 当歌曲项的“更多操作”按钮被点击时调用。
         * @param song       相关的歌曲对象。
         * @param anchorView 点击的按钮视图，可用作 PopupMenu 的锚点。
         */
        void onSongOptionsClick(Song song, View anchorView);
    }

    /**
     * SongAdapter 的构造函数。
     * @param songClickListener    歌曲项点击事件的监听器。
     * @param optionsClickListener “更多操作”按钮点击事件的监听器。
     */
    public SongAdapter(@NonNull OnSongClickListener songClickListener,
                       @NonNull OnSongOptionsClickListener optionsClickListener) {
        super(DIFF_CALLBACK);
        this.songClickListener = songClickListener;
        this.optionsClickListener = optionsClickListener;
    }

    /**
     * DiffUtil.ItemCallback 用于高效地计算列表差异，优化 RecyclerView 的更新。
     */
    private static final DiffUtil.ItemCallback<Song> DIFF_CALLBACK = new DiffUtil.ItemCallback<Song>() {
        @Override
        public boolean areItemsTheSame(@NonNull Song oldItem, @NonNull Song newItem) {
            // 通常基于唯一的ID来判断是否为同一个Item
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull Song oldItem, @NonNull Song newItem) {
            // 比较Item的内容是否相同，Song类需要正确实现equals方法
            return oldItem.equals(newItem);
        }
    };

    @NonNull
    @Override
    public SongViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 从XML布局文件 item_song.xml 创建 ViewHolder 实例
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_song, parent, false);
        return new SongViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull SongViewHolder holder, int position) {
        Song song = getItem(position); // ListAdapter 提供的方法，获取当前位置的歌曲
        if (song != null) {
            // 将歌曲数据绑定到 ViewHolder，并传递监听器
            holder.bind(song, songClickListener, optionsClickListener);
        }
    }

    /**
     * ViewHolder 类，用于缓存列表项的视图引用，避免重复调用 findViewById。
     */
    static class SongViewHolder extends RecyclerView.ViewHolder {
        ImageView ivCover;        // 歌曲封面缩略图 (ID: imageView_item_song_cover)
        TextView tvTitle;         // 歌曲标题 (ID: textView_item_song_title)
        TextView tvArtistAlbum;   // 歌手和专辑信息 (ID: textView_item_song_artist_album)
        TextView tvDuration;      // 歌曲时长 (ID: textView_item_song_duration)
        ImageButton btnOptions;   // 更多操作按钮 (ID: imageButton_item_song_options)

        /**
         * ViewHolder 构造函数。
         * @param itemView 列表项的根视图。
         */
        SongViewHolder(View itemView) {
            super(itemView);
            // 初始化视图控件，使用 item_song.xml 中定义的ID
            ivCover = itemView.findViewById(R.id.imageView_item_song_cover);
            tvTitle = itemView.findViewById(R.id.textView_item_song_title);
            tvArtistAlbum = itemView.findViewById(R.id.textView_item_song_artist_album);
            tvDuration = itemView.findViewById(R.id.textView_item_song_duration);
            btnOptions = itemView.findViewById(R.id.imageButton_item_song_options);
        }

        /**
         * 将歌曲数据绑定到 ViewHolder 的视图上，并设置点击监听器。
         * @param song               要绑定的歌曲对象。
         * @param songClickListener  歌曲项点击监听器。
         * @param optionsClickListener “更多操作”按钮点击监听器。
         */
        void bind(final Song song,
                  final OnSongClickListener songClickListener,
                  final OnSongOptionsClickListener optionsClickListener) {

            // 设置歌曲标题
            tvTitle.setText(song.getTitle());
            // 设置艺术家和专辑信息
            tvArtistAlbum.setText(String.format("%s - %s", song.getArtistName(), song.getAlbumName()));
            // 设置歌曲时长，使用TimeUtil格式化
            tvDuration.setText(TimeUtil.formatDuration(song.getDuration()));

            Context context = itemView.getContext(); // 获取上下文，用于Glide加载图片
            Uri coverUri = null;
            if (song.getAlbumArtUri() != null && !song.getAlbumArtUri().isEmpty()) {
                try {
                    coverUri = Uri.parse(song.getAlbumArtUri());
                } catch (Exception e) {
                    Timber.e(e, "Error parsing albumArtUri: %s", song.getAlbumArtUri());
                }
            }

            // 使用Glide加载专辑封面
            Glide.with(context)
                    .load(coverUri) // 如果coverUri为null，Glide会加载error/placeholder
                    .placeholder(R.drawable.default_album_art) // 确保有此默认封面资源
                    .error(R.drawable.default_album_art)       // 加载失败时显示的图片
                    .into(ivCover);

            // 设置整个列表项的点击事件
            itemView.setOnClickListener(v -> {
                if (songClickListener != null) {
                    int currentPosition = getAdapterPosition(); // 获取当前准确的位置
                    if (currentPosition != RecyclerView.NO_POSITION) { // 确保位置有效
                        songClickListener.onSongClick(song, currentPosition);
                    }
                }
            });

            // 设置“更多操作”按钮的点击事件
            btnOptions.setOnClickListener(v -> {
                if (optionsClickListener != null) {
                    optionsClickListener.onSongOptionsClick(song, btnOptions); // 将按钮本身作为锚点传递
                }
            });
        }
    }
}
